home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Misc / msql-1.0.6 / src / msql / msql_yacc.y < prev    next >
Text File  |  1995-05-28  |  6KB  |  463 lines

  1. /*
  2. **    msql_yacc.y    - 
  3. **
  4. **
  5. ** Copyright (c) 1993  David J. Hughes
  6. **
  7. ** Permission to use, copy, and distribute for non-commercial purposes,
  8. ** is hereby granted without fee, providing that the above copyright
  9. ** notice appear in all copies and that both the copyright notice and this
  10. ** permission notice appear in supporting documentation.
  11. **
  12. ** The software may be modified for your own purposes, but modified versions
  13. ** may not be distributed.
  14. **
  15. ** This software is provided "as is" without any expressed or implied warranty.
  16. **
  17. ** ID = "$Id:"
  18. **
  19. */
  20.  
  21. %{
  22. #include <stdio.h>
  23. #include <sys/types.h>
  24.  
  25. #include <sys/socket.h>
  26. #include <netinet/in.h>
  27. #include <arpa/inet.h>
  28. #include <signal.h>
  29. #include <netdb.h>
  30.  
  31. #include "msql_priv.h"
  32. #include "msql.h"
  33.  
  34. int    yylineno;
  35. extern    int selectWildcard,
  36.     selectDistinct,
  37.     yytoklen;
  38. ident_t    *msqlCreateIdent();
  39.  
  40. #define myFree(x) Free(x,__FILE__,__LINE__)
  41.  
  42. %}
  43.  
  44. %token  END_OF_INPUT
  45.  
  46. %token    GE
  47. %token    LE
  48. %token    NE
  49. %token    EQ
  50. %token    GT
  51. %token    LT
  52.  
  53. %token    CREATE
  54. %token    DROP
  55. %token    INSERT
  56. %token    DELETE
  57. %token    SELECT
  58. %token    UPDATE
  59.  
  60. %token    ALL
  61. %token    DISTINCT
  62.  
  63. %token    WHERE
  64. %token    ORDER
  65. %token    FROM
  66. %token    INTO
  67. %token    TABLE
  68. %token    BY
  69. %token    ASC
  70. %token    DESC
  71. %token    LIKE
  72. %token    AND
  73. %token    OR
  74. %token    VALUES
  75. %token    SET
  76.  
  77. %token    NOT
  78. %token    NULLSYM
  79.  
  80. %token    PRIMARY
  81. %token    KEY
  82.  
  83. %token    IDENT
  84. %token    TEXT
  85. %token    NUM
  86. %token    REAL_NUM
  87.  
  88. %token    INT
  89. %token    BOOL
  90. %token    CHAR
  91. %token    REAL
  92.  
  93.  
  94.  
  95. %%
  96.  
  97. /*
  98. ** High level definitions
  99. **
  100. ** Note : The lex input routines return a flag character of \001 to
  101. **     indicate the end of input.  This allows me to force a query
  102. **    to be terminated at a know point (ie. the end of the query-buf)
  103. **    Without this something like "select * from foo ;" is found by
  104. **    yacc to be a legit query followed by a second query containing
  105. **    only a ';' character.  The flag is generated by msqlInput() and
  106. **    msqlFlexInput() in msql_io.c
  107. */
  108.  
  109. query
  110.     : /* NULL */
  111.     | verb_clause END_OF_INPUT
  112.         {    
  113.             msqlProcessQuery();
  114.             msqlClean();
  115.         }
  116.  
  117. verb_clause
  118.     : create
  119.     | select
  120.     | drop
  121.     | insert
  122.     | update
  123.     | delete
  124.  
  125.  
  126. /*
  127. ** Create : create database tables
  128. */
  129.  
  130.  
  131. create
  132.     : CREATE TABLE IDENT '(' 
  133.         {
  134.             command = CREATE;
  135.             msqlAddTable($3,NULL);
  136.         }
  137.       field_list ')'
  138.  
  139.  
  140. field_list
  141.     : field_list_item
  142.     | field_list ',' field_list_item
  143.  
  144.  
  145.  
  146. field_list_item
  147.     : qual_ident type opt_nullspec opt_keyspec
  148.         { 
  149.             if(msqlAddField($1,$2,arrayLen,notnullflag,keyflag)<0)
  150.             {
  151.                 msqlClean();
  152.                 return;
  153.             }
  154.             if (arrayLen)
  155.             {
  156.                 (void)myFree(arrayLen);
  157.             }
  158.             arrayLen = 0;
  159.         }
  160.  
  161.  
  162.  
  163. type
  164.     : INT
  165.     | REAL
  166.     | CHAR '(' NUM ')'
  167.         { 
  168.             arrayLen = $3; 
  169.             $$=$1; 
  170.         }
  171.  
  172.  
  173. opt_nullspec
  174.     : /* NULL */    
  175.         {
  176.             notnullflag = 0;
  177.         }
  178.     | NOT NULLSYM    
  179.         {
  180.             notnullflag = 1;
  181.         }
  182.  
  183.  
  184. opt_keyspec
  185.     : /* NULL */    
  186.         {
  187.             keyflag = 0;
  188.         }
  189.     | PRIMARY KEY    
  190.         {
  191.             keyflag = 1;
  192.         }
  193.  
  194.  
  195.  
  196.  
  197. /*
  198. ** Select : retrieve data from table
  199. */
  200.  
  201.  
  202. select
  203.     : SELECT dist_qual item_list FROM table_list where_clause order_clause
  204.         {
  205.             command = SELECT;
  206.         }
  207.  
  208. dist_qual
  209.     : /* NULL */
  210.         { selectDistinct = 0; }
  211.     | ALL
  212.         { selectDistinct = 0; }
  213.     | DISTINCT
  214.         { selectDistinct = 1; }
  215.  
  216. item_list
  217.     : item_list ',' field
  218.     | field
  219.     | '*'
  220.         {
  221.             ident_t    *tmp;
  222.  
  223.             tmp = msqlCreateIdent(NULL,"*");
  224.             msqlAddField(tmp,0,0,0,0);
  225.             selectWildcard = 1;
  226.         }
  227.  
  228. field
  229.     : qual_ident
  230.         {
  231.             msqlAddField($1,0,0,0,0);
  232.         }
  233.  
  234. table_list
  235.     : IDENT
  236.         {
  237.             msqlAddTable($1,NULL);
  238.         }
  239.     | IDENT EQ IDENT
  240.         {
  241.             msqlAddTable($1, $3);
  242.         }
  243.     | table_list ',' IDENT
  244.         {
  245.             msqlAddTable($3,NULL);
  246.         }
  247.     | table_list ',' IDENT EQ IDENT
  248.         {
  249.             msqlAddTable($3, $5);
  250.         }
  251.  
  252.  
  253. where_clause
  254.     : /* NULL */
  255.     | WHERE cond_list
  256.  
  257.  
  258. cond_list
  259.     : cond_list cond_cont qual_ident cond_op cond_literal
  260.         { msqlAddCond($3,$4,$5,$2); } 
  261.     | qual_ident cond_op cond_literal
  262.         { msqlAddCond($1,$2,$3,NO_BOOL); }
  263.  
  264.  
  265. cond_cont
  266.     : AND
  267.         { $$ = (char *)AND_BOOL; }
  268.     | OR
  269.         { $$ = (char *)OR_BOOL; }
  270.  
  271. cond_op
  272.     : EQ
  273.         { $$ = (char *)EQ_OP; }
  274.     | NE
  275.         { $$ = (char *)NE_OP; }
  276.     | LT
  277.         { $$ = (char *)LT_OP; }
  278.     | LE
  279.         { $$ = (char *)LE_OP; }
  280.     | GT
  281.         { $$ = (char *)GT_OP; }
  282.     | GE
  283.         { $$ = (char *)GE_OP; }
  284.     | LIKE
  285.         { $$ = (char *)LIKE_OP; }
  286.     | NOT LIKE
  287.         { $$ = (char *)NOT_LIKE_OP; }
  288.  
  289.  
  290. order_clause
  291.     : 
  292.     | ORDER BY order_list
  293.  
  294. order_list
  295.     : order_list ',' qual_ident order_dir
  296.         { msqlAddOrder($3,(int) $4); }
  297.     | qual_ident order_dir
  298.         { msqlAddOrder($1,(int) $2); }
  299.  
  300. order_dir
  301.     : ASC
  302.     | DESC
  303.     | /* NULL */
  304.         { $$ = (char *) ASC; }
  305.  
  306.  
  307. /*
  308. ** Drop : delete entire table
  309. */
  310.  
  311. drop
  312.     : DROP TABLE IDENT
  313.         {
  314.             command = DROP;
  315.             msqlAddTable($3,NULL);
  316.         }
  317.  
  318.  
  319. /*
  320. ** Insert : add new data to table
  321. */
  322.  
  323. insert
  324.     : INSERT INTO IDENT opt_field_spec 
  325.         {
  326.             command = INSERT;
  327.             msqlAddTable($3,NULL);
  328.             if ($4)
  329.                 expandTableFields($3);
  330.         }
  331.       VALUES '(' values ')'
  332.  
  333.  
  334. opt_field_spec
  335.     : /* NULL */
  336.         {
  337.             ident_t    *tmp;
  338.  
  339.             tmp = msqlCreateIdent(NULL,"*");
  340.             msqlAddField(tmp,0,0,0,0);
  341.             $$ = (char *) 1;
  342.         }
  343.     | '(' fields ')'
  344.         {
  345.             $$ = (char *) 0;
  346.         }
  347.  
  348.  
  349. fields
  350.     : fields ',' qual_ident
  351.         { 
  352.             msqlAddField($3,0,0,0,0);
  353.         }
  354.     | qual_ident
  355.         { 
  356.             msqlAddField($1,0,0,0,0); 
  357.         }
  358.  
  359.  
  360.  
  361. values
  362.     : values ','  literal
  363.         { 
  364.             msqlAddFieldValue($3);
  365.          }
  366.     |  literal
  367.         { 
  368.             msqlAddFieldValue($1); 
  369.         }
  370.  
  371.  
  372.  
  373. /*
  374. ** Update : replace a table entry
  375. */
  376.  
  377. update
  378.     : UPDATE IDENT SET update_list where_clause
  379.         {
  380.             command = UPDATE;
  381.             msqlAddTable($2,NULL);
  382.         }
  383.  
  384. update_list
  385.     : update_list ',' qual_ident EQ literal
  386.         { msqlAddField($3,0,0,0,0);
  387.           msqlAddFieldValue($5); }
  388.     | qual_ident EQ literal
  389.         { msqlAddField($1,0,0,0,0);
  390.           msqlAddFieldValue($3); }
  391.  
  392.  
  393. /*
  394. ** Delete : conditionally delete table entries (or all entries)
  395. */
  396.  
  397. delete
  398.     : DELETE  FROM IDENT where_clause 
  399.         {
  400.             command = DELETE;
  401.             msqlAddTable($3,NULL);
  402.         }
  403.  
  404.  
  405. /*
  406. ** Common definitions
  407. */
  408.  
  409. literal
  410.     : TEXT
  411.         {
  412.             $$ = (char *)msqlCreateValue($1,CHAR_TYPE,yytoklen);
  413.             (void)myFree($1);
  414.         }
  415.     | NUM
  416.         {
  417.             $$ = (char *)msqlCreateValue($1,INT_TYPE,0);
  418.             (void)myFree($1);
  419.         }
  420.     | REAL_NUM
  421.         {
  422.             $$ = (char *)msqlCreateValue($1,REAL_TYPE,0);
  423.             (void)myFree($1);
  424.         }
  425.     | NULLSYM
  426.         {
  427.             $$ = (char *)msqlCreateValue("null",NULL_TYPE,0);
  428.         }
  429.  
  430. cond_literal
  431.     : literal
  432.         {
  433.             $$ = $1;
  434.         }
  435.     | qual_ident
  436.         {
  437.             $$ = (char *)msqlCreateValue($1,IDENT_TYPE);
  438.         }
  439.  
  440.  
  441. qual_ident
  442.     : IDENT
  443.         { 
  444.             $$ = (char *)msqlCreateIdent(NULL,$1); 
  445.             (void)myFree($1);
  446.             if ($$ == NULL)
  447.             {
  448.                 msqlClean();
  449.                 return;
  450.             }
  451.         }
  452.     | IDENT '.' IDENT
  453.         { 
  454.             $$ = (char *)msqlCreateIdent($1,$3); 
  455.             (void)myFree($1);
  456.             (void)myFree($3);
  457.             if ($$ == NULL)
  458.             {
  459.                 msqlClean();
  460.                 return;
  461.             }
  462.         }
  463.